home *** CD-ROM | disk | FTP | other *** search
/ TeX 1995 July / TeX CD-ROM July 1995 (Disc 1)(Walnut Creek)(1995).ISO / graphics / gnuplot / term / fig.trm < prev    next >
Text File  |  1993-09-15  |  8KB  |  310 lines

  1. /*
  2.  * $Id: fig.trm%v 3.50 1993/07/09 05:35:24 woo Exp $
  3.  */
  4.  
  5. /* GNUPLOT - fig.trm */
  6. /*
  7.  * Copyright (C) 1990, 1991, 1992
  8.  *
  9.  * Permission to use, copy, and distribute this software and its
  10.  * documentation for any purpose with or without fee is hereby granted,
  11.  * provided that the above copyright notice appear in all copies and
  12.  * that both that copyright notice and this permission notice appear
  13.  * in supporting documentation.
  14.  *
  15.  * Permission to modify the software is granted, but not the right to
  16.  * distribute the modified code.  Modifications are to be distributed
  17.  * as patches to released version.
  18.  *
  19.  * This software  is provided "as is" without express or implied warranty.
  20.  *
  21.  * This file is included by ../term.c.
  22.  *
  23.  * This terminal driver supports:
  24.  *  Fig graphics language
  25.  *
  26.  * AUTHORS
  27.  *  Micah Beck, David Kotz
  28.  *
  29.  * send your comments or suggestions to (info-gnuplot@dartmouth.edu).
  30.  *
  31.  */
  32.  
  33. #ifdef MSDOS
  34. #define long int
  35. #endif /* MSDOS */
  36.  
  37. /*
  38.  * Original for Fig code output by Micah Beck, 1989
  39.  * Department of Computer Science, Cornell University
  40.  * Updated by David Kotz for gnuplot 2.0
  41.  * More efficient output by Ian Dall
  42.  * Updated to FIG 2.1 (with color) format by Vivek Khera
  43.  */
  44. #include "object.h"                     /* from the XFig distribution */
  45. #define FIG_DEFAULT DEFAULT
  46. #define FIG_ROMAN_FONT (0)    /* actually, the default font */
  47.  
  48. #ifndef FIG_RES
  49. /* Must be 80 for the Fig editor, but may be increased if used
  50.  * only by TransFig filters.
  51.  * Represents pixels per inch.
  52.  */
  53. #define FIG_RES         (80)
  54. #endif
  55.  
  56. #define FIG_COORD_SYS   2
  57.  
  58. #define FIG_MAGIC       "#FIG 2.1"
  59. #define FIG_HTIC        (5*FIG_RES/80)
  60. #define FIG_VTIC        (5*FIG_RES/80)
  61. #define FIG_FONT_S      (10)    /* size in points */
  62. #define FIG_VCHAR       (FIG_FONT_S*72/FIG_RES) /* height of font in pixels */
  63. #define FIG_HCHAR       (FIG_VCHAR*6/10) /* this is a guess at the width */
  64. #define FIG_ARROW_WIDTH (FIG_HTIC/2 + 1)
  65. #define FIG_ARROW_HEIGHT FIG_HTIC
  66.  
  67. static long FIG_xbase = FIG_RES/2;
  68. static long FIG_ybase = FIG_RES/2;
  69.  
  70. static long FIG_posx;
  71. static long FIG_posy;
  72. static int FIG_poly_vec_cnt;
  73. enum FIG_poly_stat {FIG_poly_new, FIG_poly_part};
  74. static enum FIG_poly_stat FIG_polyvec_stat;
  75. /* 5 inches wide by 3 inches high */
  76. #define FIG_XMAX (5 * FIG_RES)
  77. #define FIG_YMAX (3 * FIG_RES)
  78.  
  79. #define FIG_XOFF (FIG_RES/4)
  80. #define FIG_YOFF (FIG_RES/4)
  81.  
  82. static int FIG_type;            /* negative types use real lines */
  83. static float FIG_spacing;       /* length of dash or dot spacing */
  84. static int FIG_justify;         /* Fig justification T_*_JUSTIFIED */
  85. static float FIG_angle;         /* Fig text angle 0=horiz, Pi/2=vert */
  86. static int FIG_use_color = FALSE;    /* do we use color or not? */
  87. static int FIG_color = DEFAULT;    /* which color to use */
  88.  
  89. #define FIG_POINT_TYPES POINT_TYPES /* we use the same points */
  90.  
  91. static
  92.   FIG_poly_clean(stat)
  93. enum FIG_poly_stat stat;
  94. {
  95.   if(stat == FIG_poly_part)
  96.         fprintf(outfile, " 9999 9999\n");
  97.   FIG_polyvec_stat = FIG_poly_new;
  98. }
  99.  
  100. FIG_options()
  101. {
  102.     FIG_use_color = FALSE;    /* assumption */
  103.  
  104.     if (!END_OF_COMMAND) {
  105.         if (almost_equals(c_token,"m$onochrome")) {
  106.             FIG_use_color=FALSE;
  107.             c_token++;
  108.         }
  109.         else if (almost_equals(c_token,"c$olor")) {
  110.             FIG_use_color=TRUE;
  111.             c_token++;
  112.         }
  113.     }
  114.  
  115.     sprintf(term_options,"%s", FIG_use_color ? "color" : "monochrome");
  116. }
  117.  
  118. FIG_init()
  119. {
  120.     FIG_posx = FIG_posy = 0;
  121.     FIG_polyvec_stat = FIG_poly_new;
  122.     FIG_linetype(-1);
  123.     FIG_justify_text(LEFT);
  124.     FIG_text_angle(0);
  125.  
  126.     fprintf(outfile, "%s\n", FIG_MAGIC);
  127.     fprintf(outfile, "%d %d\n", FIG_RES, FIG_COORD_SYS);
  128. }
  129.  
  130.  
  131. FIG_graphics()
  132. {
  133.     FIG_posx = FIG_posy = 0;
  134.     FIG_polyvec_stat = FIG_poly_new;
  135.     /* there is no way to have separate pictures in a FIG file */
  136. }
  137.  
  138.  
  139. FIG_text()
  140. {
  141.     /* there is no way to have separate pictures in a FIG file */
  142.     FIG_poly_clean(FIG_polyvec_stat);
  143.     FIG_posx = FIG_posy = 0;
  144.     fflush(outfile);
  145. }
  146.  
  147.  
  148. /* Line types for FIG work like this:
  149.  *  for monochrome:
  150.  *  -2 : solid (border)
  151.  *  -1 : dotted 4 (axes)
  152.  *   0 : solid (first curve)
  153.  *   1 : dotted 3
  154.  *   2 : dashed 3
  155.  *   3 : dotted 6
  156.  *   4 : dashed 6
  157.  *   ... ...
  158.  *  for color, cycle through colors. once colors are used up, repeat colors
  159.  *   but start using dashed lines of different dash length. don't use white
  160.  *   as a color.
  161.  */
  162.  
  163. FIG_linetype(linetype)
  164.         int linetype;                   /* expect linetype >= -2 */
  165. {
  166.     int last_FIG_type = FIG_type;
  167.     int last_FIG_spacing = FIG_spacing;
  168.     switch (linetype) {
  169.            case 0:
  170.            case -2: {
  171.                   FIG_type = SOLID_LINE;
  172.                   FIG_spacing = 0.0;
  173.           if (FIG_use_color) FIG_color = BLACK;
  174.                   break;
  175.            }
  176.            case -1: {
  177.                   FIG_type = DOTTED_LINE;
  178.                   FIG_spacing = 4.0; /* gap */
  179.           if (FIG_use_color) FIG_color = BLACK;
  180.                   break;
  181.            }
  182.            default: {
  183.                 linetype = abs(linetype); /* shouldn't be negative anyway */
  184.                 /* now linetype >= 1 */
  185.         if (FIG_use_color) {
  186.           FIG_type = (linetype >= WHITE);    /* dashed line */
  187.           FIG_color = linetype % WHITE;
  188.           FIG_spacing = (linetype / WHITE) * 3;
  189.         } else { /* monochrome */
  190.                   FIG_type = linetype % 2 + 1; /* dotted, dashed, ... */
  191.                   FIG_spacing = (linetype+1) / 2 * 3;
  192.         }
  193.                   break;
  194.            }
  195.     }
  196.     if (FIG_type != last_FIG_type || FIG_spacing != last_FIG_spacing)
  197.       FIG_poly_clean(FIG_polyvec_stat);
  198. }
  199.  
  200. FIG_move(x,y)
  201.         unsigned int x,y;
  202. {
  203.     int last_FIG_posx = FIG_posx;
  204.     int last_FIG_posy = FIG_posy;
  205.     FIG_posx = x;
  206.     FIG_posy = y;
  207.     if (FIG_posx != last_FIG_posx || FIG_posy != last_FIG_posy)
  208.           FIG_poly_clean(FIG_polyvec_stat);
  209. }
  210.  
  211.  
  212. FIG_vector(ux,uy)
  213.      unsigned int ux,uy;
  214. {
  215.   int x=ux, y=uy;
  216.  
  217.   if (FIG_polyvec_stat != FIG_poly_part)
  218.     {
  219.       fprintf(outfile, "%d %d %d %d %d %d %d %d %6.3f %d %d %d\n",
  220.               O_POLYLINE, T_POLYLINE,
  221.               FIG_type, 1, FIG_color, 0, FIG_DEFAULT, 0, FIG_spacing, 0,0,0);
  222.       fprintf(outfile, "%d %d",
  223.               FIG_XOFF + FIG_posx, FIG_YMAX + FIG_YOFF - FIG_posy);
  224.       FIG_poly_vec_cnt = 1;
  225.       FIG_polyvec_stat = FIG_poly_part;
  226.     }
  227.   fprintf(outfile, " %d %d",
  228.           FIG_XOFF +  x, FIG_YMAX + FIG_YOFF-y);
  229.   FIG_poly_vec_cnt++;
  230.   if (FIG_poly_vec_cnt > 50)
  231.     FIG_poly_clean(FIG_polyvec_stat);
  232.  
  233.   FIG_posx = x;
  234.   FIG_posy = y;
  235. }
  236.  
  237.  
  238. FIG_arrow(sx, sy, ex, ey, head)
  239.         int sx, sy;     /* start coord */
  240.         int ex, ey;     /* end coord */
  241.     TBOOLEAN head;
  242. {
  243.     FIG_poly_clean(FIG_polyvec_stat);
  244.         fprintf(outfile, "%d %d %d %d %d %d %d %d %6.3f %d  %d %d\n",
  245.                 O_POLYLINE, T_POLYLINE,
  246.                 FIG_type, 1, FIG_color, 0, FIG_DEFAULT, 0, FIG_spacing,
  247.         0, head ? 1 : 0, 0);
  248.         /* arrow line */
  249.     if ( head )
  250.             fprintf(outfile, "%d %d %.3f %.3f %.3f\n",
  251.                     0, 0, 1.0,
  252.             (double)FIG_ARROW_WIDTH, (double)FIG_ARROW_HEIGHT);
  253.         fprintf(outfile, "%d %d %d %d 9999 9999\n",
  254.                 FIG_XOFF + sx, FIG_YOFF + FIG_YMAX - sy,
  255.         FIG_XOFF + ex, FIG_YOFF + FIG_YMAX - ey);
  256.  
  257.         FIG_posx = ex;
  258.         FIG_posy = ey;
  259. }
  260.  
  261.  
  262. FIG_put_text(x, y, str)
  263.         int x, y;
  264.         char *str;
  265. {
  266.   if (strlen(str) == 0) return;
  267.   FIG_poly_clean(FIG_polyvec_stat);
  268.   y -= FIG_VCHAR/2;    /* assuming vertical center justified */
  269.  
  270.     fprintf(outfile, "%d %d %d %d %d %d %d %6.3f %d %d %d %d %d %s\01\n",
  271.                   O_TEXT, FIG_justify,
  272.                   FIG_ROMAN_FONT, FIG_FONT_S, FIG_DEFAULT, FIG_DEFAULT, 0,
  273.           FIG_angle, SPECIAL_TEXT, FIG_VCHAR, FIG_HCHAR*strlen(str),
  274.           FIG_XOFF + x, FIG_YMAX + FIG_YOFF-y, str);
  275. }
  276.  
  277. int FIG_justify_text(mode)
  278.         enum JUSTIFY mode;
  279. {
  280.     switch(mode) {
  281.            case LEFT: FIG_justify = T_LEFT_JUSTIFIED; break;
  282.            case CENTRE: FIG_justify = T_CENTER_JUSTIFIED; break;
  283.            case RIGHT: FIG_justify = T_RIGHT_JUSTIFIED; break;
  284.            /* shouldn't happen */
  285.            default: FIG_justify = T_LEFT_JUSTIFIED; return (FALSE); break;
  286.     }
  287.     return (TRUE);
  288. }
  289.  
  290. int FIG_text_angle(angle)
  291.         int angle;
  292. {
  293.     if (angle)
  294.          FIG_angle = Pi / 2.0;  /* vertical is pi/2 radians */
  295.     else
  296.          FIG_angle = 0.0;               /* horizontal */
  297.     return (TRUE);
  298. }
  299.  
  300. FIG_reset()
  301. {
  302.     FIG_poly_clean(FIG_polyvec_stat);
  303.     FIG_posx = FIG_posy = 0;
  304.     fflush(outfile);
  305. }
  306.  
  307. #ifdef MSDOS
  308. #undef long
  309. #endif /* MSDOS */
  310.